package com.hyq.learn.api.rest;

import com.hyq.learn.api.model.request.ValidatedRequest;
import com.hyq.learn.api.model.request.ValidatedTwoRequest;
import com.hyq.learn.api.service.ValidatedService;
import com.hyq.learn.common.response.CommonResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 测试spring参数校验相关功能
 * 1、普通 Bean 使用 @Validated 是通过动态代理完成的。具体的拦截器是 MethodValidationInterceptor。
 * 2、Controller 层之所以能 @Validated 和 @Valid 二选一，是因为校验的是参数本身，而普通 Bean 校验的是 Bean 本身。
 * 所以在controller的方法上直接使用@Validated即可进行参数校验，而针对其他service等方法进行校验是则必须在类的级别上添加@Validated注解
 * 同时在需要校验的方法之中添加校验的实际注解即可。
 *
 * @author heyuqin
 * @date 2024/9/4 11:15
 */
@RestController
@RequestMapping("validated")
public class ValidatedController {

    private static final Logger LOGGER = LoggerFactory.getLogger(ValidatedController.class);

    // 测试service校验参数的相关功能；
    @Autowired
    private ValidatedService validatedService;

    @PostMapping("test")
    public CommonResponse<String> test(@Validated @RequestBody ValidatedRequest request) {
        LOGGER.info("Controller 参数校验通过");
        validatedService.test(request.getName(), request.getAge());
        validatedService.test_2(new ValidatedTwoRequest(request.getName(), request.getAge()));
        return CommonResponse.success("参数校验通过");
    }

}
